package config

import (
	"fmt"
	"os"
	"path/filepath"

	"github.com/spf13/viper"
)

// Config 应用配置结构
type Config struct {
	App      AppConfig      `mapstructure:"app"`
	Server   ServerConfig   `mapstructure:"server"`
	Database DatabaseConfig `mapstructure:"database"`
	Redis    RedisConfig    `mapstructure:"redis"`
	Log      LogConfig      `mapstructure:"log"`
}

// AppConfig 应用基本配置
type AppConfig struct {
	Name        string `mapstructure:"name"`
	Version     string `mapstructure:"version"`
	Environment string `mapstructure:"environment"` // dev, test, prod
	Debug       bool   `mapstructure:"debug"`
}

// ServerConfig HTTP 服务器配置
type ServerConfig struct {
	Host           string `mapstructure:"host"`
	Port           int    `mapstructure:"port"`
	ReadTimeout    int    `mapstructure:"readTimeout"`    // 秒
	WriteTimeout   int    `mapstructure:"writeTimeout"`   // 秒
	MaxHeaderBytes int    `mapstructure:"maxHeaderBytes"` // 字节
}

// DatabaseConfig 数据库配置
type DatabaseConfig struct {
	Driver          string `mapstructure:"driver"`
	Host            string `mapstructure:"host"`
	Port            int    `mapstructure:"port"`
	Database        string `mapstructure:"database"`
	Username        string `mapstructure:"username"`
	Password        string `mapstructure:"password"`
	Charset         string `mapstructure:"charset"`
	MaxIdleConns    int    `mapstructure:"maxIdleConns"`
	MaxOpenConns    int    `mapstructure:"maxOpenConns"`
	ConnMaxLifetime int    `mapstructure:"connMaxLifetime"` // 秒
	LogLevel        string `mapstructure:"logLevel"`        // silent, error, warn, info
	EnableCache     bool   `mapstructure:"enableCache"`     // 是否启用 Gorm 二级缓存
}

// RedisConfig Redis 配置
type RedisConfig struct {
	Host     string `mapstructure:"host"`
	Port     int    `mapstructure:"port"`
	Password string `mapstructure:"password"`
	DB       int    `mapstructure:"db"`
	PoolSize int    `mapstructure:"poolSize"`
}

// LogConfig 日志配置
type LogConfig struct {
	Level      string `mapstructure:"level"`      // debug, info, warn, error
	Format     string `mapstructure:"format"`     // text, json
	Output     string `mapstructure:"output"`     // stdout, file
	OutputFile string `mapstructure:"outputFile"` // 日志文件路径
}

// LoadConfig 加载配置
func LoadConfig(configPath string) (*Config, error) {
	var config Config

	// 设置默认配置文件路径
	if configPath == "" {
		// 获取当前工作目录
		workDir, err := os.Getwd()
		if err != nil {
			return nil, fmt.Errorf("获取工作目录失败: %w", err)
		}

		// 默认配置文件路径
		configPath = filepath.Join(workDir, "configs", "config.yaml")
	}

	// 设置 Viper 配置
	viper.SetConfigFile(configPath)
	viper.AutomaticEnv() // 读取环境变量

	// 读取配置文件
	if err := viper.ReadInConfig(); err != nil {
		return nil, fmt.Errorf("读取配置文件失败: %w", err)
	}

	// 解析配置到结构体
	if err := viper.Unmarshal(&config); err != nil {
		return nil, fmt.Errorf("解析配置失败: %w", err)
	}

	return &config, nil
}
